/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja2;
/**
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Luis Ernesto Orozco Godinez
CarnÈ:10382
23 de Julio del 2011
Hoja de Trabajo #2
Clase: Hoja2
 * Descripcion: Esta clase contendra el main del programa
*/

/**
 *
 * @author luisorozco
 */


// se importan las diferentes librerias
import java.lang.RuntimeException;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.text.DecimalFormat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Hoja2<T> extends Stack<T> {
    
    
            //metodo de la clase principal
            
            // Utilizamos  IOException es una checked exception, por lo cual, en caso de ser declarada tiene que ser manejada 
            //dentro del método. Existen dos modos de manejar una excepción: Arrojándola o tratándola. Cuando arrojas
            //una excepción (usando la palabra reservada throws) quiere decir que en el método donde la arrojas no es 
            //necesario darle un tratamiento en específico
           public static void main(String[] args) throws IOException
           {
            
               
            // declaramos una variable con un string
            String s = darExpresion();
         
           
             // creamos una objeto llamado pila de nuestra clase Stack
            Stack<String> pila = new Stack<String>();
                    
            
            // declaramos variables locales
            int resultado = 0;
            
            // aca se hara para obtener la longitud del String que tiene dicha variable que es  's'
               // pero lo que realmente queremos es ver que numeros y operando inserto el usuario
            int longitud = s.length();
            
            // hacemos un for segun la longitud que tenga la cadena longitud
            for(int i = 0 ; i < longitud; i++)
            {
                //declaramos una variables que nos servira para ver qeu caracter se va evaluar
                 char car = s.charAt(i);    
                 
                 // se hace varios if para ver si el caracter es un numero operando o es =
                 if(car=='(')
                 {
                     //si no hay nada se sale del ciclo y el resultado es 0
                         resultado = 0;
                 }
                 if(car=='1' || car=='2' ||car=='3' || car=='4' || car=='4' ||car=='5'|| car=='6' || car=='7' ||car=='8' || car=='9' || car=='0')
                 {
                     // revisa si fue un numero de 0 a 9, si es asi lo mete en la pila
                         pila.push(Character.toString(car));
                 }
                 if(car=='+')
                 {
                     // revisa si ingreso un más, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo suma
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando1 + operando2;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 if(car=='-')
                 {
                      // revisa si ingreso un menos, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo resta
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando2 - operando1;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 if(car=='*')
                 {
                      // revisa si ingreso un por, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo multiplica
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando1 * operando2;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 
                 if(car=='/')
                 {
                      // revisa si ingreso un divisor, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo divide
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                 	
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando2 / operando1;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                         
                 }
                 
                 // en este if revisa que si el ultimo caracter fue un = este imprimira el resultado y se sale del ciclo
                 if(car=='=')
                 {
                           System.out.println("+------------------------>  "+"El resultado es: "+ pila.pop() + "  <-------------------------+");
                           System.out.println("\n"+"+--------------------------------------------------------------------------+");
                           System.out.println("+--------------------------------------------------------------------------+");
                 }
             }
            
        
        // TODO code application logic here
    }
    
     // el siguiente metodo servira para guardar o almacenar la linea de operando y operadores que el usario ingrese
        public static String darExpresion() throws IOException
        {
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("\n"+"+--------------------------------------------------------------------------+");
            System.out.println("+---------------------Bienvenido a la Hoja 2-------------------------------+");
            System.out.println("+--------------------------------------------------------------------------+"+"\n");
            System.out.println("Ingrese la expresión a evaluar... NOTA: al finalizar ingrese el simbolo '=':");
          
             // creamos un objeto de reasLine el cual nos servira para leer la linea introducida por el usuario
            String s = read.readLine();
            return s;
        }
        
       

}


//prueba